package com.wqm.step.pojo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
// 指定表名，数据库名(可以省略,配置文件中只连了mvc_hiber_anot数据库)
@Table(name = "c_customer", catalog = "mvc_hiber_anot")
public class Customer implements Serializable{
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "cid")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	// 不配置，以数据库为准
	private String name;

	/**
	 *  因为Customer是一方，所以这边为参考： 一对多
	 *  mappedBy = "c" ,它代表的是外键的维护由Order方来维护，而Customer不维护，
	 *  这时你在保存客户时，级联保存订单，是可以的，但是不能维护外键，
	 *  所以，我们必须在代码中添加订单与客户关系,才能维护外键。
	 *  
	 *  使用cascade可以完成级联操作 它可常用取值： 
	 *  none这是一个默认值 
	 *  save-update,当我们配置它时，底层使用save update或save-update完成操作，级联保存临时对象，如果是游离对象，会执行update. 
	 *  delete 级联删除 
	 *  delete-ophan删除与当前对象解除关系的对象。
	 *  all 它包含了save-update delete操作 
	 *  all-delete-orphan它包信了delete-orphan与all操作
	 * 
	 *  cascade与inverse有什么区别?  这里的mappedBy和xml配置中的inverse一个意思。
	 *  cascade它是完成级联操作 ,记住：哪边配置了级联，在session.save/update/delete(传入哪边的对象)
	 *  Inverse它只有在双向关联情况下有作用，它来指定由哪一方维护外键。
	 * 
	 */
	@OneToMany(targetEntity = Order.class, mappedBy = "c")
	@Cascade(CascadeType.SAVE_UPDATE)// 最好写在没有外键的一方，不要两边都写，第一、这样会增加数据库的update语句，影响性能。
									 //									       第二、如果级联删除，不至于删除过多，当然现实开发中，一般不使用级联删除
	private Set<Order> orders = new HashSet<Order>();

	public Customer() {
		super();
		// TODO Auto-generated constructor stub
	}

	// 投影查询 必须提供对应的有参构造
	public Customer(Integer id, String name) {
		super();
		this.id = id;
		this.name = name;
	}



	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Order> getOrders() {
		return orders;
	}

	public void setOrders(Set<Order> orders) {
		this.orders = orders;
	}

	/**
	 *  重写toString，要去掉Set<Order> orders的对象，保证在调用toString()的时候不会陷入死循环
	 *  一对多，两边的实体类toString都要修改
	 */
	/*@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", orders=" + orders + "]";
	}*/
	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + "]";
	}

}
